/*
 *
 *
 */

package jcworks;
import java.util.ArrayList;


public class Vezerlo {
	protected Munkaterulet munkaterulet;
        public static boolean konzolnaplozas = true;


        public Vezerlo()
            {
                if(Vezerlo.konzolnaplozas)
                    {
                        Vezerlo.naplozas("A Vezerlo osztaly letrejott");
                    }
                
                this.munkaterulet = new Munkaterulet();
            }
        

        public static void naplozas(String Uzenet) {
		System.out.println("# " + Uzenet);
	}

         public static void naplozas(String Uzenet, String Message) {

                    System.out.println("\r\n---------------------------");
                    System.out.println("| "+ Message);
                    System.out.println("---------------------------");
                    System.out.println("# " + Uzenet);
                    System.out.println("---------------------------\r\n");

	}

	public void letrehozas() {
		throw new UnsupportedOperationException();
	}

	public void mentes() {
		throw new UnsupportedOperationException();
	}

	public void betoltes() {
		throw new UnsupportedOperationException();
	}

	public void futtatas() throws UresMunkateruletException
            {
		//Kigyűjtjük mi a leghosszabb jelsorozat
                int maxJelSorozatHoszz = 0;

                    //Lekérjük az alkatrészlistát
                    ArrayList<Epitoelemek> alkatreszek = munkaterulet.getAlkatreszLista();

                    //Ha üres a munkaterület, dobunk exceptiontt :)
                    if(alkatreszek.isEmpty())
                        throw new UresMunkateruletException();


                    maxJelSorozatHoszz = 0;

                    //Végigiterálunk, s ha jelgenerátor, lekérdezzük a hosszát, majd maximumot választunk, egyébként visszatekerjük.
                    for(int i = 0;i < alkatreszek.size();i++)
                                {
                                    if(alkatreszek.get(i) instanceof Jelgenerator)
                                        {
                                           Jelgenerator temp = (Jelgenerator) alkatreszek.get(i);

                                           //Visszatekerjuk a jelgeneratort
                                           temp.visszateker();

                                           //Kiirjuk a jelzorozatot, amit lefuttatunk a halozaton
                                           //Vezerlo.naplozas(temp.getJelsorozatAsString(),temp.getAzonosito() + ". azonositoju jelgenerator jelsorozata:");

                                            if(temp.getJelsorozat().length > maxJelSorozatHoszz)
                                                maxJelSorozatHoszz = temp.getJelsorozat().length;
                                        }                                    
                                }

                    //Maxjelsorozatszor csinálunk egy kört az a szimulációban
                    if(maxJelSorozatHoszz == 0) maxJelSorozatHoszz++; //Ha csak kapcsolo van akkor a hossz nulla lenne, de egynek kell legyen.

                    for(int i = 0; i < maxJelSorozatHoszz;i++)
                        {

                           if(vankijelzo()) //Csak akkor írjuk ki a step eredményét, ha van kijelző az áramkörben, ellenkező esetben felesleges...
                           {
                               Vezerlo.naplozas("");
                               Vezerlo.naplozas("A(z) " + (i+1) + ". step adatai:");
                           }
                            this.step();
                        }
             }
                    
            
        public boolean vankijelzo() //Segédfüggvény, megadja van-e kijelző az áramkörben.
            {
            
                boolean eredmeny = false;

                //Lekérjük az alkatrészlistát
                ArrayList<Epitoelemek> alkatreszek = munkaterulet.getAlkatreszLista();

                for(int i = 0;i < alkatreszek.size();i++)
                    {
                        if(alkatreszek.get(i) instanceof Kijelzo && !(alkatreszek.get(i) instanceof Oszcilloszkop))
                        {
                            eredmeny = true;
                        }
                    }

               return eredmeny;
            }

	public void step() throws UresMunkateruletException
            {
                //Lekérjük az alkatrészlistát
                ArrayList<Epitoelemek> alkatreszek = munkaterulet.getAlkatreszLista();

                //Ha üres a munkaterület, dobunk exceptiontt :)
                if(alkatreszek.isEmpty())
                    throw new UresMunkateruletException();


               //Addig böködjük az aktuális szintek elemeit, ameddig van nagyobb szint :)
               int      aktualisSzint = 0;
               boolean  vanMegSzint   = false;


                    //Addig iterálunk újra és újra végig az összes elemen míg van magasabb szintű elem, mint az aktuális szint
                    do{                        
                        vanMegSzint = false;
                        
                        for(int i = 0;i < alkatreszek.size();i++)
                                {
                                    int pillanatnyilagVizsgaltAlkatreszSzintje = alkatreszek.get(i).getSzint();

                                    //Meghatarozzuk van-e elem a kovetkezo szinten
                                    if(pillanatnyilagVizsgaltAlkatreszSzintje == aktualisSzint+1)
                                        vanMegSzint = true;      


                                    //Az aktualis szinten levo elemeket megbokjuk
                                    if(pillanatnyilagVizsgaltAlkatreszSzintje == aktualisSzint)
                                        try{
                                                alkatreszek.get(i).bokes();
                                            }
                                        catch(Exception e)
                                        {
                                            Vezerlo.naplozas("Hiba tortent a(z) " + alkatreszek.get(i).getAzonosito() + ". elem bokesekor: " + e.getMessage(),"Hiba" );
                                            System.exit(1);
                                        }
                                }

                        aktualisSzint++;

                      } while(vanMegSzint);


                  //A végén kiadjuk mik a kimenetek a kijelzőkön
                   for(int i = 0;i < alkatreszek.size();i++)
                        {
                            if(alkatreszek.get(i).getSzint() == -1)
                                {
                                                               
                                    Kijelzo temp = (Kijelzo) alkatreszek.get(i); //kivesszük a kijelzőt

                                    if(temp instanceof Oszcilloszkop) // Ho osszcilloszkop, csak megbokjuk
                                        {
                                            Oszcilloszkop temp2 = (Oszcilloszkop) temp;

                                            try{
                                                temp2.bokes();
                                            }
                                            catch(Exception e){
                                                Vezerlo.naplozas("Hiba tortent a(z) " + temp2.getAzonosito() + ". elem bokesekor: " + e.getMessage());
                                                System.exit(1);

                                            }
                                        }
                                    else //ha kijelzo, kijelzunk...
                                        {
                                            Vezerlo.naplozas("A(z) " + temp.getAzonosito() + ". azonositoju kijelzo erteke: " + temp.getAllapot());
                                        }
                                }

                        
                   }
	}

}
